package javaNIO1.channel;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;

/**
 * Created with Intel IDEA.
 *
 *  文件通道：
 * @Auther: gjt
 * @Date: 2024/7/14 11:08
 */
//@Slf4j
public class fileChannel {

    private static final String PATH = "D:\\新建文件夹\\【M01】Lims进样统计表.xlsx";
    // private static final String PATH = "C:\\Users\\lcbio\\Desktop\\【M01】Lims进样统计表.xlsx";
    public static void main(String[] args) throws IOException {
        /**
         * 基本文件方法
         * 每个文件通道都有一个 position 的概念 ，决定从文件中哪一出开始读取或者写;表示当前文件字节位置 ；它是从底层的文件描述获得，意思就是文件的位置和通道的位置是共享的，一个改变另一个也改变
         * 当位置达到了末尾 ，read() 会返回 -1
         */

        File files = new File(PATH);
        if (!files.exists()) {
//            log.error("文件不存在: {}", PATH);
            return;
        }

//        RandomAccessFile file = new RandomAccessFile(files, "r");

        FileInputStream file = new FileInputStream(files);
        // 标记100
//        file.seek(10);

//        // 获取通道
        FileChannel channel = file.getChannel();
//        System.out.println(channel.isOpen() + "通道是否打开 ");
//        System.out.println("通道位置：" + channel.position());
//
//        // 通道改变位置
//        channel.position(20);
//        System.out.println("文件位置：" + file.getFilePointer());

        // 文件所锁 ：他代表的锁是与底层的文件相关，和通道不关联
//        FileLock lock = channel.lock();


        FileLock lock = null;
        /**
         * 使用文件锁的操作都放到 try 块中
         */
        try{
            // 查看这个lock 对象是由那个通道创建
//            FileChannel channel1 = lock.channel();
//            System.out.println(channel1.toString() + "通道" );

            // 释放文件锁： 或者它所关联的通道被关闭 或者jVM 退出：是与java 进程关联与线程不关联
//            lock.release();
            // 尝试获取文件锁
            try {
                lock = channel.lock(0, channel.size(), true);
            } catch (OverlappingFileLockException e) {
//                log.error("文件锁定失败1", e);
                System.out.println("文件锁定失败1");
            }

            // 检测文件锁是否有效
            boolean valid = lock.isValid();
            System.out.println("文件锁有效：" +valid);

            // 文件锁是否是共享的
            System.out.println("文件锁是否是共享" + lock.isShared());

        } finally {
            lock.release();
        }



    }
}
